package Tree_09.ThreadedBinaryTree_03;

/*
 * @Author 罗
 * @date 2020/3/21 - 12:52 下午
 *
 */


import Tree_09.BinaryTree_01.DataStructure.Node;
import Tree_09.BinaryTree_01.Entity.HeroNode;

/**
 * left,right依然用父类Node的left,right
 *  核心：在部分递归场景可以使用强制类型转换
 *      ThreadedNode temp = root;//这里root为ThreadedNode类型
 *          while(true){
 *
 *              temp = (ThreadedNode)temp.left;
 *          }
 *      left属性只有在父类Node中才有，而left是一个指针，指向了另外一个Node节点
 *      temp.left是Node类型的，temp是Threaded类型的，如果要使用递归迭代之类的
 *              必须使用强制类型转换
 *      但是强转之后，如果要调用ThreadedNode属性，都需要进行强制类型转换
 *
 *      都怪解耦的方式不对，指针节点不要轻易继承，继承了之后，指针要强制类型转换
 */
public class ThreadedNode extends Node {



    /*
     * 说明: 当线索化二叉树后，Node节点的 属性 left 和 right ，有如下情况:
     *   left 指向的是左子树，也可能是指向的前驱节点
     *   right指向的是右子树，也可能是指向后继节点
     */
    RightPointerType rightPointerType;

    LeftPointerType leftPointerType;

    @Override
    public String toString() {
        return

                item+"\t" +
                rightPointerType +
                "\t" + leftPointerType  ;
    }

    public ThreadedNode(HeroNode item) {
        super(item);
    }
}

enum RightPointerType{
    /*右子树，后继节点*/
    rightSubtree,descendantNode
}
enum LeftPointerType{
    /*左子树，前驱节点*/
    leftSubTree,precursorNode
}

